package com.otod.pm.prj.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSONObject;
import com.otod.base.exception.AppException;
import com.otod.base.service.BaseService;
import com.otod.commons.entity.Page;
import com.otod.commons.utils.BizCodeUtil;
import com.otod.commons.utils.Collections3;
import com.otod.commons.utils.StringUtils;
import com.otod.pm.prj.bo.DetailCfgFiledBo;
import com.otod.pm.prj.mapper.DetailCfgMapper;
import com.otod.pm.prj.mapper.DetailMapper;
import com.otod.pm.prj.vo.DetailCfgVo;
import com.otod.pm.prj.vo.DetailVo;

/**
 * 产品类型管理
 * @author yiChen
 */
@Service
@Transactional(readOnly=true)
public class DetailService extends BaseService {
	//产品类型信息
	@Autowired
	DetailCfgMapper detailCfgMapper;
	//产品基本信息
	@Autowired
	DetailMapper detailMapper;
	
	
	/**
	 * 得到随机数拥有填充主键
	 */
	@Transactional
	public String addDetailCfg() {
		return super.getUUID();
	}
	/**
	 * 分页查询类型信息
	 * @param page	分页信息
	 * @param param	参数
	 * @return	分页信息和结果数据
	 */
	public Page queryForList(Page page,Map<String,Object> param){
		List<DetailCfgVo> dataList =  detailCfgMapper.queryForList(page,param);
		page.setAaData(dataList);
		return page;
	}
	/***
	 * 新增产品类型
	 * @param vo
	 */
	@Transactional
	public void addDetailCfg(List<DetailCfgVo> list) {
		for (DetailCfgVo detailCfgVo : list) {
			
			detailCfgMapper.insert(detailCfgVo);
		}
		
		
	}
	
	/***
	 * 新增产品类型没有选择字段的时候 或者只有一个字段的时候
	 * @param vo
	 */
	@Transactional
	public void addDetailCfgNo(DetailCfgVo vo) {
			detailCfgMapper.insert(vo);	
	}
	
	/***
	 * 查询出最新的产品类型
	 * @param vo
	 * @return 
	 */
	
	public List<DetailCfgVo> selectDetailPrjType(String prj_type) {
		return detailCfgMapper.selectDetailPrjType(prj_type);
		
	}
	
	/***
	 * 通过prjType 和  version
	 * @param vo
	 * @return 
	 */
	
	public List<DetailCfgVo> selectDetailPrjTypeOld(String prjType,Integer version) {
		Map<String, Object> parms = new HashMap<String,Object>();
		parms.put("prjType", prjType);
		parms.put("version", version);
		return detailCfgMapper.queryForList(parms);
		
	}
	
	/**
	 * 查询出类型最大的版本号码
	 * @param prjType 类型
	 * @return
	 */
	public int getMaxVersion(String prjType){
		Integer version = detailCfgMapper.getMaxVersion(prjType);
		return version == null ? 0 : version;	
	}
	/**
	 * 根据产品类型修改 状态
	 * @param prjType 类型
	 * @return
	 */
	@Transactional
	public void updateStatus(String prjType,String status,int version){
		detailCfgMapper.updateStatus(prjType, version, status);
	}
	
	
	/**
	 * 通过名字  版本号码 产品类型查询数据
	 * @param prjType
	 * @param filedName
	 * @param version
	 * @return
	 */
	
	public DetailCfgVo queryDetailCfgS(String prjType,String filedName,int version){
		
		Map<String, Object> map = new HashMap<String,Object>();
		map.put("prjType", prjType);
		map.put("fieldName", filedName);
		map.put("version", version);
		return detailCfgMapper.queryDetailCfgS(map);
	}
	/**********************************************查询产品基本信息  表名是pm_t_detail*************************************/
	/**
	 * 分页查询产品的基本信息
	 * @param page  分页信息
	 * @param param	分页参数
	 * @return 分页信息和结果数据
	 */
	public Page queryForListDetail(Page page,Map<String,Object> param){
		List<DetailVo> dataList =  detailMapper.queryForList(param);
		page.setAaData(dataList);
		return page;
	}
	
	//测试
	/**
	 * 根据归属产品查询最新的数据
	 * @param prjId
	 * @return
	 */
	public DetailVo queryDetail(String prjId){
		//通过prjId查询信息 这个考虑了相同的prjId 查询 最大的cfg_version(最大的版本号)
		return detailMapper.selectDetailInfo(prjId);
	}
	
	/**
	 * 
	 * 
	 * 通过prjType 和状态 status 查询 pm_t_detailCfg相关的字段
	 * @param prjType
	 * @param status
	 * @return
	 */
	public List<DetailVo> queryDetail(String prjType,String status){
		return detailCfgMapper.selectDetailFileName(prjType, status);
		
	}
	
	
	
	
	/**
	 *  保存数据  向表 detail
	 * 添加数据  向表pm_t_detail
	 * @param vo
	 */
	@Transactional
	public void saveDetail(DetailVo vo){
		//设置主键
		vo.setUuid(addDetailCfg());
		detailMapper.insert(vo);
	}
	/**
	 * 修改 detail表中的数据
	 * @param map
	 */
	@Transactional
	public void updateDetail(Map<String, Object> map){
		detailMapper.update(map);
		
	}
	
	/**
	 *  通过uuid修改 detail表中的数据
	 * 添加数据  向表pm_t_detail
	 * @param vo
	 */
	@Transactional
	public void updateDetail(DetailVo vo){
		Map<String, Object> map = new HashMap<String,Object>();
		map.put("detailVo", vo);
		detailMapper.update(map);
	}
	
	/**
	 * 通过uuid 和 版本号cfgversion 查询数据  表是  detail
	 * @param prjId
	 * @param cfgversion
	 * @return
	 */
	public DetailVo selectDetail(String prjId,int cfgVersion){
		
		return detailMapper.queryDetail(prjId, cfgVersion);
	}
	

	/**
	 * 通过uuid  查询数据  表是  detail
	 * @param prjId
	 * @param cfgversion
	 * @return
	 */
	public DetailVo selectDetailPrjId(Map<String, Object> param) throws AppException {
		
		List<DetailVo> list = detailMapper.queryForList(param);
		if(Collections3.isEmpty(list)){
			throw new AppException("没有取到您要的数据 ");
		}
		return detailMapper.queryForList(param).get(0) ;
	}
	
	
	/************************************************************************************************/
	
	
	/**
	 * List<DetailCfgVo> 转  List<DetailCfgFiledBo>
	 * @param list List<DetailCfgVo>
	 * @return list List<DetailCfgVo>
	 * @author jqiu
	 */
	public List<DetailCfgFiledBo> detailCfgListVo2Bo(List<DetailCfgVo> list){
		List<DetailCfgFiledBo> boList = new ArrayList<DetailCfgFiledBo>(); 
		DetailCfgFiledBo detailCfgFiledBo = null;
		
		if(Collections3.isEmpty(list)){
			return boList;
		}
		
		for (DetailCfgVo detailCfgVo : list) {
			detailCfgFiledBo = new DetailCfgFiledBo();
			detailCfgFiledBo.setFieldName(detailCfgVo.getFieldName());
			detailCfgFiledBo.setFieldType(detailCfgVo.getFieldType());
			detailCfgFiledBo.setFieldcommonts(detailCfgVo.getFieldcommonts());
			detailCfgFiledBo.setVersion(detailCfgVo.getVersion());
			detailCfgFiledBo.setViewType(detailCfgVo.getFieldRela());
			if(StringUtils.isNotEmpty(detailCfgFiledBo.getViewType())){
				JSONObject jsonObject = JSONObject.parseObject(detailCfgFiledBo.getViewType());
				String dictNo=jsonObject.getString("rela");
				//得到具体的值
				detailCfgFiledBo.setCodeList(BizCodeUtil.getBizCodeList(dictNo));	
			}
			
			detailCfgFiledBo.setValidate(detailCfgVo.getValidate());
			
			boList.add(detailCfgFiledBo);
		}
		return boList;
	}
}
